/*
*
* 定义类的语法
* [权限修饰符]  [修饰符]  class 类名{  类体}
*public 公共的
* default 默认(不写)  缺省
*修饰符:abstract 抽象 final最终...
* class 类的关键字
* Student类名
* {  类体 }
*
* 类名:字母开头  首字母大写
*
* 类的构成:
* 1.成员变量(属性)
* 2.方法
* 3.构造方法(构造器)
* 4.内部类
* 5.代码块
* */

public class Student {
    // 成员变量
    // 语法
    // [权限修饰符]    [修饰符]  数据类型   变量名 ;  [=初始值]
    // 学号
    public String id;
    // 姓名
    public String name;
    // 年龄
    public int age = 12;
    // 性别
    public char sex='m';
    // 身高
    public double height;
    public double weight;
    public String phone;
    public String address;
    public String classname;

    /*
    * 方法:实现某种特定的功能
    *语法
    * [权限修饰符] [修饰符] 返回值||void  方法名(参数列表){
    *       方法体;
    *       return ;
    * }
    *参数列表:  数据类型  参数名,数据类型  参数名,.....
    * */
    // 学生跑
    // 定义了没有返回值的方法
    public void run(){
        System.out.println("student run");
//        return ;
    }
    // 有参数有返回值
    // 学生会加法
    // 返回int类型的结果  参数是两个int类型的值
    /*
    * 方法重载overload
    * 一个类中,方法名相同,参数不同(个数 类型  顺序)
    * 系统会根据参数的不同,自动决定调用对应的方法
    * 和方法的返回值无关
    *
    * */
//    public void add(int a,int b){
//        System.out.println("add(int a,int b)");
//        int result = a+b;
//    }
    public int  add(int a,int b){
        System.out.println("add(int a,int b)");
        int result = a+b;
//        return result;
        return 1;
        // return执行以后 该方法终止执行  后面的代码不执行
//        System.out.println();
    }
    public double test1(int a,int b){
        if(a>10){
            return a+b;
        }else{
//            return b;
        }
        return a;
    }


    public double  add(int a,double b){
        System.out.println("add(int a,double b)");
        double result = a+b;
        return result;
    }
    public double  add(double a,int b){
        System.out.println("add(double a,int b)");
        double result = a+b;
        return result;
    }
    public int  add(int a,int b,int c){
        System.out.println("add(int a,int b,int c)");
        int result = a+b+c;
        return result;
    }
    // 有参数没有返回值
    public  void write(String s){
        // 局部变量
        String name= "小李";
        // 成员变量
        this.name = "";
        System.out.println("学生写:"+s);
    }

    public int test2(int a){
        for(int i=1;i<=100;i++){
            if(a%2==0){
                break;
//                return 0;
            }else{
                // return执行以后 整个方法停止执行
                // 所有循环都会终止
                return 1;
            }
        }
        return 0;
    }
    public int test3(){
        int[][] arr = new int[10][10];
        for(int i=0;i<20;i++){
            while(true){
                int x =(int)(Math.random()*10);
                int y =(int)(Math.random()*10);
                // 防止重复埋雷
                // 不断产生随机数 判断是否满足条件  直到满足为止
                if(arr[x][y] !=1){
                    arr[x][y] =1;
//                    break;
                    System.out.println("----");
                    return 2;
                }
            }
        }
        // 显示埋雷 图形
        for (int i = 0; i < arr.length ; i++) {
            for (int j = 0; j <arr[i].length ; j++) {
                System.out.print(arr[i][j]+"\t");
            }
            System.out.println();
        }
        return 1;
    }
    public void test4(){
        int[][] arr = new int[10][10];
        for(int i=0;i<20;i++){
            while(true){
                int x =(int)(Math.random()*10);
                int y =(int)(Math.random()*10);
                // 防止重复埋雷
                // 不断产生随机数 判断是否满足条件  直到满足为止
                if(arr[x][y] !=1){
                    arr[x][y] =1;
//                    break;
                    System.out.println("----");
                    // 不返回内容  作用:终止方法执行
                    return ;
                }
            }
        }
        // 显示埋雷 图形
        for (int i = 0; i < arr.length ; i++) {
            for (int j = 0; j <arr[i].length ; j++) {
                System.out.print(arr[i][j]+"\t");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        // 局部变量
        String name= "小李";
        // 实例化对象
        // 声明该类型
        // student 引用
        Student student;
        //  new  构造方法();
        student = new Student();

        Student student1 = new Student();
        // 利用对象 调用属性和方法
        System.out.println(student.sex);
        System.out.println(student.height);
        System.out.println(student.weight);
        // String 类型默认值是null
        System.out.println(student.name);
        student.name="小明";
        student.classname="一年一班";
        // 对象.方法
        student.run();
        student.write("hello world");
        // 定义变量接受返回值
        int result = student.add(1,2);
        System.out.println(result);

        // 调用有参构造创建对象
        Student student2 = new Student("小红");
//        student2.run();
//        System.out.println(student2.name);
        Student student3 = new Student("小王",80.5);
        Student student4 = new Student(80.5);
        Student student5 = new Student(55.55,"test");

        student5.add(1,2);
        student5.add(1.1,2);
        int result1 = student5.add(1,2,3);
        System.out.println(result1);
        student5.add(2,1.5);
        student5.test4();
    }
    // 构造方法(构造器)
    /*
    * 语法
    * 权限修饰符  方法名(参数列表){
    *
    * }
    * 构造方法的方法是类名
    * 构造方法没有返回值  连void都没有
    *
    * 构造方法的作用:实例化对象 并赋初始值
    * 一个类中 默认有一个无参构造方法
    * 如果显式的声明有参构造,会自动覆盖无参构造,导致默认的无参构造无效
     */
    /*
    * 构造方法的重(chong)载 overload
    *一个类中,方法名相同,参数不同(个数  类型  顺序)
    * 系统会根据参数的不同自动调用对应的构造方法
    *
    * */
    // 无参构造
    public Student(){
        System.out.println(" Student()");
    }
    // 有参构造
    public Student(String name){
        // 将传来的参数值 赋值给属性(成员变量)name
        this.name = name;
        System.out.println("Student(String name)");
    }
    public Student(double weight){
        this.weight = weight;
        System.out.println("Student(double weight)");
    }
    public Student(String name,double weight){
        this.name = name;
        this.weight = weight;
        System.out.println("Student(String name,double weight)");
    }
    public Student(double weight,String name){
        this.name = name;
        this.weight = weight;
        System.out.println("Student(double weight,String name)");
    }
    public Student(double weight,double height){
        this.height = height;
        this.weight = weight;
        System.out.println("Student(double weight,double height)");
    }

}
